IMPCLK page# 0001 next
2: COMMENT ⊗   VALID 00024 PAGES 
3: RECORD PAGE   DESCRIPTION
4:  00001 00001
5:  00004 00002    BEGIN IMPSER
6:  00005 00003     ERROR TYPEOUT ROUTINE. INCREMENTS APPROPRIATE ERROR COUNTER THEN
7:  00007 00004     OPCODE DEFINITIONS FOR SECOND LEVEL PROTOCAL
8:  00011 00005     PROTOCAL ERROR CODES
9:  00013 00006    COMMENT         A BRIEF DESCRIPTION OF THE PROTOCAL
10:  00018 00007                    MORE PROTOCAL DESCRIPTIONS
11:  00022 00008     BYTE POINTERS TO PARTS OF MESSAGE HEADER.
12:  00025 00009     SPECIAL BITS IN RH OF IOS
13:  00028 00010     ROUTINES TO MAKE AND RELEASE IMP DEVICE DATA BLOCKS
14:  00029 00011     CLOCK LEVEL ROUTINE. CALLED EVERY TICK. EXAMINES INPUT MESSAGES
15:  00032 00012     WE GET HERE IF THERE ARE MESSAGES WAITING ON THE INPUT LIST
16:  00034 00013     MESSAGE TYPE DISPATCHES - TRACE, FROM IMP, IMP GOING DOWN
17:  00036 00014     IMP DEAD CODE - RUN DOWN LINK TABLE AND WAKE UP ANY WAITERS
18:  00038 00015     INTERFACE TIMED OUT (SHUDDER!). BRING THE SYSTEM DOWN.
19:  00040 00016     BLOCKED LINK, LINK TABLE FULL, RFNM, AND NOP
20:  00042 00017     HOST OR DESTINATION IMP DEAD. MARK HOST DEAD AND GIVE EVERYBODY ERRORS.
21:  00045 00018     INCOMPLETE TRANSMISSION, ERROR WITH MESSAGE IDENTIFICATION
22:  00048 00019     UNKNOWN LINK AND NO DDB ERROR TYPEOUTS
23:  00049 00020     ROUTINE TO MAKE UP A POINTER INTO THE HOST TABLES
24:  00050 00021     ROUTINE TO UNBLOCK LINK ZERO AND WAKE UP ANYBODY WAITING FOR IT
25:  00052 00022     ROUTINE TO TRANSMIT ANY MESSAGES IN CLOCK WAIT ON LINK 0
26:  00054 00023     ROUTINE TO FLUSH ALL CLOCK-LEVEL OUTPUTS TO A PARTICULAR HOST
27:  00055 00024     UNBLOCKING ROUTINE FOR NON-ZERO LINK
28:  00057 ENDMK
29: ⊗;
    IMPCLK page# 0002 next  prev
31: BEGIN IMPSER
32: SUBTTL NETWORK CONTROL PROGRAM FOR THE INTERGALACTIC MESSAGE PROCESSOR - JAM SEPT '71
    IMPCLK page# 0003 next  prev
34: ; ERROR TYPEOUT ROUTINE. INCREMENTS APPROPRIATE ERROR COUNTER THEN
35: ; TYPES CTY MESSAGE.
36: 
37: DEFINE TELCTR (CTR,MESS) <
38:         AOS CTR
39:         SKIPN IMPPMS    ; DO WE PRINT TODAY?
40:         JRST .+7        ; NO, SKIP OVER ERROR MESSAGE
41:         PUSHJ P,DISDATE
42:         PUSHJ P,DISERR
43:         [ASCIZ / IMP - MESS NUMBER /]
44:         DISARG DEC,CTR
45:         [ASCIZ /
46: /]
47:         -1
48: >
49: 
50: DEFINE ERRCTR (CTR,MESS) <
51:         AOS CTR
52:         PUSHJ P,DISDATE
53:         PUSHJ P,DISERR
54:         [ASCIZ / IMP - MESS NUMBER /]
55:         DISARG DEC,CTR
56:         [ASCIZ /
57: /]
58:         -1
59: >
60: 
61: ; DATA BLOCK DEFINITIONS . . .
62: 
63: TLINK←←0        ; XWD <NEXT MESSAGE>,<NEXT BLOCK THIS MESSAGE>
64: TWC←←1          ; DATA WORD COUNT
65: TLEN←←2         ; LENGTH OF DATA PORTION OF BLOCK
66: TBP←←3          ; INPUT BYTE POINTER
67: TDATA←←4        ; BEGINNING OF DATA AREA
68: TLNG←←50        ; LENGTH OF ENTIRE BLOCK
69: TDLEN←←TLNG-TDATA
70:                 ; LENGTH OF DATA PORTION ONLY
71: 
72: ; DEBUGGING MASKS
73: 
74: LEADM←←741774007777     ; MASK FOR LEADER
75: SCM←←740077777400       ; MASK FOR SIZE AND COUNT FIELDS
    IMPCLK page# 0004 next  prev
77: ; OPCODE DEFINITIONS FOR SECOND LEVEL PROTOCAL
78: 
79: NOP←←0          ; NO-OPERATION
80: RTS←←1          ; ESTABLISH CONNECTION, SENT FROM RECEIVER TO SENDER
81:                 ; FOLLOWED BY 32 BITS OF RECEIVE SOCKET,
82:                 ; 32 BITS OF SEND SOCKET, AND 8 BITS OF LINK NUMBER
83: STR←←2          ; ESTABLISH CONNECTION, SENT FROM SENDER TO RECEIVER
84:                 ; FOLLOWED BY 32 BITS OF SEND SOCKET,
85:                 ; 32 BITS OF RECEIVE SOCKET, AND 8 BITS OF BYTE SIZE.
86: CLS←←3          ; CLOSE CONNECTION. FOLLOWED BY 32 BITS LOCAL SOCKET
87:                 ; NUMBER AND 32 BITS FOREIGN SOCKET NUMBER
88: ALL←←4          ; ALLOCATE. SENT FROM RECEIVER TO SENDER TELLING HOW
89:                 ; MUCH DATA MAY BE SENT AT A TIME. FOLLOWED BY
90:                 ; 8 BITS OF LINK NUMBER, 16 BITS OF MESSAGE SPACE
91:                 ; AND 32 BITS OF BIT SPACE.
92: GVB←←5          ; GIVE BACK ALLOCATION. SENT FROM RECEIVER TO SENDER
93:                 ; TO REQUEST RETURN OF STORAGE. FOLLOWED BY 8 BITS
94:                 ; OF LINK NUMBER, 8 BITS OF A 7-FIXED-BINARY-PLACE
95:                 ; FRACTION WHICH IS THE FRACTION OF THE MESSAGE
96:                 ; SPACE TO BE RETURNED, AND 8 BITS OF FRACTION WHICH
97:                 ; IS THE FRACTION OF THE BIT SPACE TO BE RETURNED.
98: RET←←6          ; RETURN STORAGE. SENT FROM SENDER TO RECEIVER EITHER
99:                 ; SPONTANEOUSLY OR IN RESPONSE TO A GVB COMMAND. FOLLOWED
100:                 ; BY 8 BITS OF LINK, 16 BITS OF MESSAGE SPACE, AND 32
101:                 ; BITS OF BIT SPACE.
102: INR←←7          ; INTERRUPT BY RECEIVER. ASKS THE SENDER TO CEASE.
103:                 ; FOLLOWED BY 8 BITS OF LINK NUMBER.
104: INS←←10         ; INTERRUPT BY SENDER. TELLS RECEIVER TO INTERRUPT
105:                 ; RECEIVING PROCESS. A SPECIAL CHARACTER IS INCLUDED
106:                 ; IN THE TEXT STREAM TO MARK WHERE IN TIME THE INTERRUPT
107:                 ; IS TO OCCUR. FOLLOWED BY 8 BITS OF LINK NUMBER.
108: ECO←←11         ; ECHO TEST. FOLLOWED BY 8 BITS OF TEST DATA. RECEIVING
109:                 ; HOST IS TO RETURN SAID DATA VERBATUM VIA FOLLOWING COMMAND.
110: ERP←←12         ; ECHO REPLY. FOLLOWED BY 8 BITS OF RETURNED TEST DATA.
111: ERR←←13         ; ERROR. FOLLOWED BY 8 BITS OF ERROR CODE AND
112:                 ; 80 BITS OF ERROR DATA.
113: RST←←14         ; RESET. ASKS HOST TO CLEAR ALL TABLES AND CONNECTIONS
114:                 ; HAVING TO DO WITH US.
115: RRP←←15         ; RESET REPLY. INDICATES THE RESET HAS BEEN DONE.
    IMPCLK page# 0005 next  prev
117: ; PROTOCAL ERROR CODES
118: 
119: ILO←←1          ; ILLEGAL OPCODE. AN ILLEGAL OPCODE WAS DETECTED IN
120:                 ; A CONTROL MESSAGE. THE "dATA" FIELD CONTAINS THE TEN BYTES OF
121:                 ; THE AILING CONTROL MESSAGE BEGINNING WITH THE BYTE CONTAINING
122:                 ; THE ILLEGAL OPCODE.
123: SPS←←2          ; SHORT PARAMETER SPACE. THE END OF A CONTROL MESSAGE
124:                 ; WAS ENCOUNTERED BEFORE ALL THE REQUIRED PARAMETERS OF
125:                 ; THE CONTROL COMMAND BEING DECODED WERE FOUND. THE "dATA"
126:                 ; FIELD CONTAINS THE COMMAND IN ERROR.
127: BDP←←3          ; BAD PARAMETERS. ERRONEOUS PARAMETERS WERE FOUND
128:                 ; IN A CONTROL COMMAND. DATA FIELD CONTAINS AILING COMMAND.
129: NES←←4          ; NON-EX SOCKET. A COMMAND OTHER THAN STR OR RTS WAS
130:                 ; RECEIVED FOR A CONNECTION FOR WHICH NO REQUEST FOR
131:                 ; CONNECTION HAS BEEN MADE.
132: LNC←←5          ; LINK NOT CONNECTED. CONTROL COMMAND CONTAINING
133:                 ; A LINK NUMBER FOR WHICH NO CONNECTION EXISTS.
134: 
135: ; WHEN THE ERROR CODE IS ZERO, THE NEXT 8 BIT BYTE IS THE STANFORD
136: ; PECULIAR ERROR CODE, FOLLOWED BY 72 BITS OF THE AILING COMMAND
137: ; RETURNED. HERE ARE THE STANFORD ERROR CODES.
138: 
139: CTO←←1          ; COUNTER OVERFLOW. EITHER MESSAGE SPACE EXCEEDED
140:                 ; OR BIT SPACE EXCEEDED BY THE LAST MESSAGE. THE
141:                 ; MESSAGE WAS DISCARDED.
142: ILB←←2          ; ILLEGAL BYTE SIZE FOR CONTROL MESSAGE. MESSAGE
143:                 ; WAS DISCARDED.
    IMPCLK page# 0006 next  prev
145: COMMENT ⊗       A BRIEF DESCRIPTION OF THE PROTOCAL
146:         THE PROTOCAL IS  IN  ABOUT  3  LAYERS.  THE  FIRST  LAYER  IS
147: IMP-HOST PROTOCAL. THE IMP SENDS US EACH MESSAGE PREFACED BY A 32-BIT
148: LEADER WHICH LOOKS LIKE THIS:
149: 
150:   0   1     2    3    4       7  8         15  16          23
151: **************************************************************
152: *   *    *     *     *         *             *               *
153: * 0 * FI * TRC * OCT *   TYPE  *     HOST    *      LINK     *
154: *   *    *     *     *         *             *               *
155: **************************************************************
156: 
157:         THE FI BIT MEANS THE MESSAGE IF FROM THE IMP TTY. THIS CAN BE
158: GENERATED USING THE CROSSPATCH MODE AND TYPING A MESSAGE TO  STANFORD
159: FROM  THE  TTY.  OUR  SYSTEM IGNORES SUCH MESSAGES. THE TRC BIT MEANS
160: THIS MESSAGE IS FOR TRACING FOR TEST PURPOSES AND WAS ISSUED FROM BBN
161: OR NMC. WE IGNORE IT ALSO. WE IGNORE THE OCT BIT. THE TYPE FIELD IS A
162: 4-BIT OPCODE TELLING WHAT KIND OF MESSAGE THIS IS. ALL DATA  MESSAGES
163: FROM  FOREIGN HOSTS ARE TYPE 0 AND ARE CALLED "rEGULAR" MESSAGES. THE
164: OTHER TYPES ARE DESCRIBED IN BBN DOCUMENT  1822  "SPECIFICATIONS  FOR
165: THE  INTERCONNECTION  OF  A HOST AND AN IMP". I WILL BRIEFLY DESCRIBE
166: THEM HERE.
167:         TYPES 1, 3, 6, 7, 8, AND 9 ARE ALL ERRORS OF DIFFERENT KINDS.
168: IT MEANS THE LAST MESSAGE YOU SENT OUT WAS FLUSHED. TYPE 1  IS  ERROR
169: WITHOUT  MESSAGE  IDENTIFICATION.  TYPE  3  IS BLOCKED LINK, WHICH IS
170: MEANS WE GOOFED. WHEN YOU SEND A MESSAGE OUT, THE LINK (IDENTIFIED BY
171: THE  HOST-LINK  NUMBER, 16 BITS) BECOMES BLOCKED UNTIL THE MESSAGE IS
172: EITHER  FLUSHED  OR  DELIVERED  TO  THE  DESTINATION  COMPUTER.   THE
173: DESTINATION  IMP  THEN  RETURNS  THE REQUEST FOR NEW MESSAGE, TYPE 5,
174: BACK TO THE SENDING HOST. IF WE SEND OUT A MESSAGE  BEFORE  THE  RFNM
175: COMES  BACK,  WE  GET  A "bLOCKED LINK" ERROR, TYPE 3. TYPE 6 IS LINK
176: TABLE FULL. THIS MEANS WE SENT  OUT  SO  MANY  MESSAGES  ON  SO  MANY
177: DIFFERENT  LINKS  THAT COMBINED WITH THE MESSAGES ALREADY IN THE IMP,
178: WE OVERFLOWED ITS TABLES. TYPE 7 MEANS THE  DESTINATION  COMPUTER  OR
179: IMP  IS  DEAD, AS DETERMINED BY THE MESSAGE STAYING IN THE IMP SYSTEM
180: FOR 90 SECONDS. THE MESSAGE IS TIMES OUT AND FLUSHED. TYPE 8 IS ERROR
181: WITH  MESSAGE  IDENTIFICATION  AND TYPE 9 IS INCOMPLETE TRANSMISSION.
182: THESE ARE VERY NEBULOUS ERRORS. IT GENERALLY MEANS YOU SENT A MESSAGE
183: LONGER  THAN  8092  BITS,  OR  SENT  AN ILLEGAL TYPE IN THE LEADER OR
184: SOMETHING.
185:         TO SUMMARIZE, THE NORMAL SEQUENCE OF EVENTS IS THAT  WE  SEND
186: OUT A MESSAGE AND SOME TIME LATER GET A RFNM BACK.
    IMPCLK page# 0007 next  prev
188:                 MORE PROTOCAL DESCRIPTIONS
189: 
190:         THE SECOND LEVEL PROTOCAL GOES AS FOLLOWS. WHEN A  CONNECTION
191: IS  OPEN,  THERE  IS  A  UNIQUE HOST-LINK NUMBER ASSOCIATED WITH EACH
192: DIRECTION OF COMMUNICATION. MESSAGES GO BACK  AND  FORTH  AS  REGULAR
193: MESSAGES.  OPENING  AND  CLOSING  CONNECTIONS  IS  THE HARD PART. ALL
194: "cONTROL" MESSAGES, THAT IS MESSAGES REGARDING  OPENING  AND  CLOSING
195: AND REGULATING CONNECTIONS THEMSELVES, GO ON LINK ZERO. MOST OF THESE
196: COMMANDS HAVE SOME IDENTIFYING FIELD THAT TELLS WHAT CONNECTION  THEY
197: ARE  TALKING  ABOUT.  OPENING  AND  CLOSING  A CONNECTION (BEFORE THE
198: UNIQUE LINK NUMBER IS ASSIGNED) IS DONE WITH THE CODES STR, RTS,  AND
199: CLS AND CARRY ALONG WHAT ARE CALLED SOCKET NUMBERS. THESE NUMBERS ARE
200: 32-BITS LONG.
201:         TO  ESTABLISH  A CONNECTION, YOU NEED A FOREIGN SOCKET NUMBER
202: TO CONNECT TO. THERE  IS  DEFINED  TO  BE  AT  EACH  SITE  A  LOGGER,
203: LISTENING  TO  SOCKET 1, WHICH RETURNS YOU A SOCKET NUMBER FOR YOU TO
204: CONNECT TO. TO OPEN A CONNECTION, YOU SEND A STR OR A RTS,  DEPENDING
205: ON  WHETHER  YOU  ARE  SENDING OR RECEIVING. THESE OPERATIONS CARRY A
206: LOCAL SOCKET NUMBER AND A FOREIGN SOCKET NUMBER  AND  ONE  ADDITIONAL
207: BYTE,  WHICH  IS  A  CONNECTION BYTE SIZE IF RTS AND A LINK NUMBER IF
208: STR. A CONNECTION IS OPEN WHEN  STR  AND  RTS  WITH  MATCHING  SOCKET
209: NUMBERS  HAVE  BEEN  EXCHANGED.  A  CONNECTION IS HALF-DUPLEX. TO GET
210: TRANSMISSION BOTH WAYS, YOU NEED TO OPEN TWO CONNECTIONS.  THE  USUAL
211: WAY  IS  TO  OPEN  A CONNECTION ON THE SOCKET NUMBER YOU GET FROM THE
212: LOGGER AND ON THAT NUMBER PLUS ONE.
213:         A  CONNECTION  MAY  BE  CHANGED  IN  AT  LEAST  TWO WAYS. THE
214: SIMPLEST IS THE RESET (RST). A HOST RECEIVING A RESET IS SUPPOSED  TO
215: BREAK  ALL  CONNECTIONS  TO THE HOST SENDING THE RESET. THE RECEIVING
216: HOST IS TO RETURN A RESET REPLY (RRP) AS WELL.
217:         THE  GRACEFUL  WAY  TO  BREAK A CONNECTION IS TO SEND A CLOSE
218: (CLS) WITH THE PAIR OF SOCKET NUMBERS. THE HOST RECEIVING THE CLS  IS
219: TO  RETURN  A  CLS  WITH  THE SAME SOCKET NUMBERS IN IT AND CAUSE THE
220: CONNECTION TO BE BROKEN. THE CONNECTION IS NOT BROKEN UNTIL CLSS HAVE
221: BEEN EXCHANGED.
222:         WHEN A CONNECTION IS OPEN, THE RECEIVER SENDS THE  SENDER  AN
223: ALLOCATE  MESSAGE  (ALL) TELLING THE SENDER HOW MUCH BUFFERING HE HAS
224: AVAILABLE. EVERY TIME THE SENDER SENDS A MESSAGE, HE DECREMENTS  THIS
225: NUMBER.  EACH TIME THE SENDER RECEIVES AN ALLOCATE OPERATION, HE ADDS
226: THE NEW ALLOCATION INTO THE CURRENT ALLOCATION. ⊗
    IMPCLK page# 0008 next  prev
228: ; BYTE POINTERS TO PARTS OF MESSAGE HEADER.
229: ; ASSUMES POINTER TO FIRST BLOCK OF MESSAGE IN AC1
230: 
231: IMPBP:  POINT 1,TDATA(AC1),1    ; 'MESSAGE FROM IMP' BIT
232: TRACEP: POINT 1,TDATA(AC1),2    ; TRACE MESSAGE BIT. MEANS MESSAGE IS
233:                                 ; BEING ROUTED AROUND THE NETWORK FOR
234:                                 ; ROUTING AND TIMING MEASUREMENT.
235: OCTALP: POINT 1,TDATA(AC1),3    ; MEANS MESSAGE IS FROM IMP DDT AND
236:                                 ; IS TEXT FOR OCTAL NUMBERS
237: TYPEP:  POINT 4,TDATA(AC1),7    ; IMP MESSAGE TYPE POINTER.
238: SRCP:   POINT 8,TDATA(AC1),15   ; HOST NUMBER POINTER
239: LINKP:  POINT 8,TDATA(AC1),23   ; LINK NUMBER POINTER
240: ELINKP: POINT 16,TDATA(AC1),23  ; PICKS UP 16 BIT HOST AND LINK NUMBER
241: SIZEP:  POINT 8,TDATA+1(AC1),11 ; GETS BYTE SIZE FIELD
242: COUNTP: POINT 16,TDATA+1(AC1),27
243:                                 ; BYTE COUNT FIELD
244: 
245: ; SPECIAL DEFINITIONS FOR 2ND LEVEL PROTOCAL
246: 
247: OPCDP:  POINT 8,TDATA+2(AC1),7
248: OLINKP: POINT 8,TDATA+2(AC1),15
249: SZLKP:  POINT 8,TDATA+4(AC1),15 ; FOR STR, IS BYTE SIZE, FOR RTS, IS LINK NUMBER
250: SOK1AP: POINT 24,TDATA+2(AC1),31; POINTS TO FIRST PART OF FIRST SOCKET NUMBER FOR STR, RTS, AND CLS
251: SOK1BP: POINT 8,TDATA+3(AC1),7  ; POINTS TO SECOND PART OF FIRST SOCKET NUMBER
252: SOK2AP: POINT 24,TDATA+3(AC1),31; FIRST PART OF SECOND SOCKET NUMBER
253: SOK2BP: POINT 8,TDATA+4(AC1),7  ; SECOND PART OF SECOND SOCKET NUMBER
254: BYTE2P: POINT 8,TDATA+2(AC1),15 ; SECOND BYTE OF MESSAGE
255: BYTE3P: POINT 8,TDATA+2(AC1),23 ; THIRD BYTE OF MESSAGE
256: 
257: ; POINTERS INTO TIMEOUT FIELDS. EACH FIELD IS NUMBER OF 2-SECOND UNITS
258: 
259: CLSTP:  POINT 6,TIMES(DDB),5    ; HOW LONG WE WILL WAIT FOR RETURN CLOSE
260: RFNMTP: POINT 6,TIMES(DDB),11   ; FOR RFNM ON ZERO OR NON-ZERO LINK
261: ALLTP:  POINT 6,TIMES(DDB),17   ; FOR ALLOCATION
262: RFCTP:  POINT 6,TIMES(DDB),23   ; FOR RETURN RFC
263: INPTP:  POINT 6,TIMES(DDB),29   ; FOR INPUT
    IMPCLK page# 0009 next  prev
265: ; SPECIAL BITS IN RH OF IOS
266: 
267: HDEAD←←002000           ; HOST DEAD
268: CTROV←←001000           ; HOST OVERFLOWED OUR ALLOCATION
269: RSET←←000400            ; HE SENT US A RESET
270: TMO←←000200             ; TIMEOUT ON WAIT STATE OCCURRED
271: BLOK←←000100            ; THIS LINK IS BLOCKED
272: 
273: ; LH BITS
274: 
275: DEFINE Z(SYM,VAL) <SYM←←VALANYW←←ANYW!VAL>
276: 
277: ANYW←←0
278: Z(INPW,200000)          ; INPUT WAIT
279: Z(LNK0W,100000)         ; CONTROL LINK WAIT
280: Z(BLOKW,040000)         ; WAITING FOR LINK TO BECOME UNBLOCKED
281: Z(ALLW,020000)          ; ALLOCATION WAIT
282: Z(TIMEW,010000)         ; TIMEOUT WAIT
283: Z(RFCW,004000)          ; WAIT FOR REQUEST FOR CONNECTION - LISTENING OR CONNECTION REQUESTED
284: Z(CLSW,002000)          ; CLOSE WAIT. ONE CLOSE HAS BEEN SENT
285: 
286: ; BITS IN LH OF STATE WORD IN IMPSTB
287: 
288: ANYC←←400000            ; ANY CHANGE OF STATE
289: RFCS←←200000            ; RFC HAS BEEN SENT
290: RFCR←←100000            ; RFC HAS BEEN RECEIVED
291: CLSS←←040000            ; CLS SENT
292: CLSR←←020000            ; CLS RECEIVED
293: LONCE←←010000           ; HCLSS HAS BEEN HERE ONCE
294: 
295: ; OTHER PARAMETERS . . .
296: 
297: MAXCNT←←2*=60*=60       ; THIS IS HOW LONG WE WILL WAIT FOR THE IMP TO GOBBLE
298:                         ; OUR OUTPUT
299: MAXMAL←←2000/TLNG       ; MAXIMUM MESSAGE ALLOCATION FOR FOREIGNERS
300: MAXBAL←←40*2000         ; MAXINAL BIT ALLOCATION
301: MINMAL←←2               ; MINIMUM MESSAGE ALLOCATION
302: MINBAL←←=36*4           ; MINIMUM BIT ALLOCATION
303: DEFMAL←←TDLEN           ; DEFAULT MESSAGE ALLOCATION
304: DEFBAL←←44*TDLEN        ; DEFAULT BIT ALLOCATION
305: 
306: ; TABLE OF BITS PER WORD FOR DIFFERENT CONNECTION BYTE SIZES
307: ; -1 MEANS THIS BYTE SIZE NOT ALLOWED.
308: 
309: BPW:    4444444444-14444
310:         4044-1-144-1-1-1
311:         40-144-1-1-1-1-1
312:         -1-1-1-1-1-1-1-1
313:         40-1-1-144
    IMPCLK page# 0010 next  prev
315: ; ROUTINES TO MAKE AND RELEASE IMP DEVICE DATA BLOCKS
316: 
317: IMPSET:
318:         MOVEI AC3,IMPDLN
319:         PUSHJ P,FSGET
320:         JRST IMPDD1
321:         HRRI DDB,1(AC1)
322:         HRLI AC1,DDBMDL-1
323:         BLT AC1,TIM(DDB)
324:         HRLM DDB,DDBMDL+DEVSER
325:         SETZM DDBMDL+DEVLOG
326:         POPJ P,
327: 
328: IMPDD1: SUB P,[XWD 3,3]
329:         JRST DLYCM1
330: 
331: IMPCLR:
332:         SETZB IOS,DEVIOS(DDB)
333:         MOVEI AC1,DDBMDL
334: IMPCL1: MOVE TAC1,AC1
335:         HLRZ AC1,DEVSER(TAC1)
336:         JUMPE AC1,CPOPJ
337:         CAIE AC1,(DDB)
338:         JRST IMPCL1
339:         MOVE DDB,DEVSER(AC1)
340:         HLLM DDB,DEVSER(TAC1)
341:         SOJA AC1,FSGIVE
    IMPCLK page# 0011 next  prev
343: ; CLOCK LEVEL ROUTINE. CALLED EVERY TICK. EXAMINES INPUT MESSAGES
344: 
345: IMPCLK:
346:         MOVEM P,IMPFP
347:         SKIPE IMPCLW            ; WAITING FOR FREE STORAGE?
348:         JRST CLKWT              ; YES, DO NOTHING ELSE FOR A WHILE
349:         SKIPE ILIST             ; ANY INCOMMING MESSAGES?
350:         JRST IMPMES             ; YES, GO PROCESS THEM
351:         SOSG IMPOCT             ; HOW LONG HAVE WE BEEN WAITING FOR OUTPUT TO FINISH?
352:         PUSHJ P,IMPTMO          ; TOO DAMN LONG. GO SEE ABOUT IT
353:         SKIPE RECOVER           ; HAS ERROR RECOVERY SYSTEM BEEN INVOKED?
354:         PUSHJ P,ERRREC          ; YES, GO KEEP ON RECOVERING.
355:         SOSGE POLCNT            ; TIME TO POLL YET?
356:         PUSHJ P,POLL            ; YES, DO IT NOW
357:         SKIPE TIMWAIT           ; ANYONE WAITING FOR A TIMEOUT?
358:         SOSLE TIMCNT            ; YES, IS IT TIME TO CHECK?
359:         POPJ P,
360:         MOVEI AC1,2*JIFSEC      ; YES, WAIT FOR ANOTHER SECOND
361:         MOVEM AC1,TIMCNT        ; RESET COUNTDOWN
362:         SKIPN AC3,FFLNK         ; ANYONE TO CHECK?
363:         POPJ P,                 ; NO, DON'T BOTHER
364: TIMCHL: SKIPE DDB,IMPDDB-1(AC3) ; ANYONE HOME?
365:         SKIPGE AC1,TIM(DDB)     ; YES, IS HE WAITING FOR US?
366:         JRST TIMCHI             ; NO TO EITHER OR BOTH
367:         SUB AC1,TIME            ; GET DIFFERENCE BETWEEN CRITICAL TIME AND RIGHT NOW
368:         JUMPL AC1,TIMN          ; DIFFERENT ROUTINE FOR NEGATIVE DIFFERENCE
369:         CAML AC1,[=12*=60*JIFMIN]
370:         SUB AC1,JIFDAY          ; WRAP IT BACK AROUND TO GET A SMALL NUMBER
371:         JRST TIMC               ; NOW CHECK IT
372: 
373: TIMN:   CAMGE AC1,[-=12*=60*JIFMIN]
374:         ADD AC1,JIFDAY
375: TIMC:   JUMPG AC1,TIMCHI        ; IF DIFFERENCE IS POSITIVE, HASN'T EXPIRED YET
376:         MOVEI IOS,TMO           ; NOTE THAT A TIMEOUT HAS HAPPENED
377:         ORM IOS,DEVIOS(DDB)
378:         PUSHJ P,QRUN
379:         SKIPLE TIMWAIT          ; ANYONE ELSE?
380: TIMCHI: SOJG AC3,TIMCHL         ; YES, GO BACK FOR MORE
381:         POPJ P,
    IMPCLK page# 0012 next  prev
383: ; WE GET HERE IF THERE ARE MESSAGES WAITING ON THE INPUT LIST
384: 
385: IMPMES: HRRZ AC1,ILIST          ; YES, PICK UP ADDRESS OF FIRST MESSAGE
386:         PUSHJ P,LEGAL           ; IS THIS A REASONABLE BLOCK
387:         JRST [  SETZM ILIST     ; NO, FLUSH THE LIST
388:                 JRST IMPCLK]
389:         LDB AC2,IMPBP           ; SEE IF IT IS FROM THE IMP
390:         JUMPN AC2,FRIMP         ; YES, DISCARD.
391:         LDB AC2,TRACEP          ; IS IT A TRACE MESSAGE
392:         JUMPN AC2,TRCMES        ; YES, DISCARD IT.
393:         LDB AC2,TYPEP           ; PICK UP MESSAGE TYPE
394:         CAIGE AC2,MAXMT         ; IS IT LEGAL?
395:         JRST @MTDSP(AC2)        ; YES, DISPATCH TO IT
396:         TELCTR(ILLMT,<ILLEGAL MESSAGE TYPE>)
397: PSCAN:  PUSHJ P,POPMESS         ; TAKE MESSAGE OFF LIST AND RELEASE STORAGE
398:         JRST IMPCLK
399: 
400: ; DISPATCH TABLE FOR MESSAGE TYPES
401: 
402: MTDSP:  REGULAR         ; REGULAR MESSAGE. ALL DATA AND CONTROL COME THROUGH HERE.
403:         EWOMI           ; ERROR WITHOUT MESSAGE IDENTIFICATION
404:         IMPGD           ; IMP GOING DOWN
405:         BLKLNK          ; BLOCKED LINK - WE GOOFED!
406:         NOPCN           ; NO OPERATION.
407:         RFNM            ; REQUEST FOR NEW MESSAGE, UNBLOCK LINK
408:         LTABF           ; LINK TABLE FULL - HORRIBLE IMP ERROR!
409:         DDEAD           ; HOST OR DESTINATION IMP DEAD
410:         EWMI            ; ERROR WITH MESSAGE IDENTIFICATION
411:         INCT            ; INCOMPLETE TRANSMISSION
412: MAXMT←←.-MTDSP
    IMPCLK page# 0013 next  prev
414: ; MESSAGE TYPE DISPATCHES - TRACE, FROM IMP, IMP GOING DOWN
415: ; TRACE MESSAGE. LOG THEN DISCARD.
416: 
417: TRCMES: AOSA TRACES
418: FRIMP:  AOS FRMIMP
419:         JRST PSCAN
420: 
421: EWOMI:  TELCTR(ERWOMI,<ERROR WITHOUT MESSAGE IDENTIFICATION>)
422:         SKIPN RECOVER
423:         SETOM RECOVER
424:         JRST PSCAN
425: 
426: IMPGD:  AOS NIMPDN
427:         PUSHJ P,IMPDD           ; BRING DOWN IMP SYSTEM
428:         JRST IMPCLK             ; GO THROUGH THE LOOP AGAIN
429: 
430: IMPDD:  SETOM IMPDEAD           ; SHUT DOWN THE IMP
431:         HRLOI AC1,377777
432:         MOVEM AC1,IMPOCT
433:         CONO IMP,ODPIEN!IDPIEN!IEPIEN
434:         SETZM IMPECT            ; SET ERROR COUNT TO ZERO
435:         PUSHJ P,DISDATE
436:         PUSHJ P,DISERR
437:         [ASCIZ / THE IMP IS DEAD!
438: LONG LIVE THE IMP!
439: /]
440:         -1
441:         SKIPE AC1,ILIST         ; NOW WE HAVE TO GIVE BACK ALL THE BUSINESS IN PROGRESS
442:         PUSHJ P,RELBLS
443:         SETZM ILIST
444:         SKIPE AC1,OLIST         ; OUTPUT LIST TOO
445:         PUSHJ P,RELBLS
446:         SETZM OLIST
447:         SKIPE AC1,L0CWTL
448:         PUSHJ P,RELBLS
449:         SETZM L0CWTL
    IMPCLK page# 0014 next  prev
451: ; IMP DEAD CODE - RUN DOWN LINK TABLE AND WAKE UP ANY WAITERS
452: 
453:         SKIPN AC3,FFLNK         ; NOW SEE IF THERE ARE ANY QUEUED RFC'S TO BE RELEASED
454:         JRST IMPDD4
455: IMPLLP: SKIPE AC1,IMPRFQ-1(AC3) ; IS THERE ANOTHER RFC LIST
456:         PUSHJ P,RELBLS
457:         SETZM IMPRFQ-1(AC3)
458:         SKIPN DDB,IMPDDB-1(AC3)
459:         JRST IMPDDI
460:         MOVE IOS,DEVIOS(DDB)
461:         ORI IOS,HDEAD!IODTER
462:         ANDCMI IOS,BLOK
463:         TLZE IOS,ANYW           ; BRING THIS GUY OUT OF WAIT STATE
464:         PUSHJ P,QRUN
465:         MOVEM IOS,DEVIOS(DDB)
466: IMPDDI: SOJG AC3,IMPLLP
467: IMPDD4: SKIPE AC1,IMPITOP       ; GIVE BACK ANY PARTIALLY IMPUTTED MESSAGE
468:         PUSHJ P,RELLST
469:         SETZM IMPITOP
470:         SKIPE AC1,IMPSPARE      ; GIVE BACK ANY SPARE BLOCKS WHAT MAY BE
471:         PUSHJ P,IMPREL
472:         SETZM IMPSPARE
473:         SKIPN AC1,IMPFSL
474:         JRST IMPDD6             ; IF NO SPARE LIST, FORGET IT
475: IMPFDL: PUSH P,(AC1)            ; SAVE ADDRESS OF NEXT BLOCK
476:         PUSHJ P,FSGIVE
477:         POP P,AC1
478:         JUMPN AC1,IMPFDL
479:         SETZM IMPFSL
480: IMPDD6: POPJ P,
    IMPCLK page# 0015 next  prev
482: ; INTERFACE TIMED OUT (SHUDDER!). BRING THE SYSTEM DOWN.
483: 
484: IMPTMO: ERRCTR(OPTMO,<INTERFACE TIMED OUT>)
485:         MOVE AC1,OPTMO
486:         CAIL AC1,10
487:         JRST IMPDD              ; IF TOO MANY TIMEOUTS, BRING DOWN THE IMP
488:         SKIPLE NOPCNT
489:         JRST IMPTM3
490:         SKIPE AC1,IMPOCUR       ; PICK UP CURRENT OUTPUT BLOCK
491:         PUSHJ P,RELLST          ; GIVE BACK THE REST OF IT
492:         SETOM RECOVER
493:         SKIPN AC1,OLIST
494:         JRST IMPTM2
495:         HLRZ AC2,TLINK(AC1)     ; GET LINK TO NEXT OUTPUT REQUEST
496:         HRRM AC2,OLIST          ; MAKE IT NEW CURRENT REQUEST
497:         SKIPN AC2
498:         SETZM OLIST
499:         HRRZS AC1
500:         CONO IMP,FINO           ; MAKE SURE INTERFACE THINKS WE ARE DONE
501:         MOVEI AC3,200
502: IMPTM1: CONSO IMP,ODONE
503:         SOJG AC3,IMPTM1
504:         JRST QIDLE              ; TRY TO START THE NEXT TRANSFER
505: 
506: IMPTM2: SETZM IMPOACT
507:         HRLOI AC1,377777
508:         MOVEM AC1,IMPOCT
509:         POPJ P,
510: 
511: IMPTM3: SETOM RECOVER
512:         CONO PI,IMPOFF
513:         CONO IMP,FINO           ;TRY TO UNHANG OUTPUT IF POSSIBLE
514:         MOVEI AC3,200
515:         CONSO IMP,ODONE
516:         SOJG AC3,.-1
517:         JRST SNDNOP             ;WILL DO CONO PI,IMPON
    IMPCLK page# 0016 next  prev
519: ; BLOCKED LINK, LINK TABLE FULL, RFNM, AND NOP
520: 
521: BLKLNK: SKIPE RECOVER
522:         JRST PSCAN
523:         SETOM RECOVER
524:         TELCTR(NBLNKS,<BLOCKED LINK>)
525:         JRST STERB
526: 
527: LTABF:  TELCTR(LTFULL,<LINK TABLE FULL!!?!?!>)
528:         JRST STERB
529: 
530: ; REQUEST FOR NEW MESSAGE. UNBLOCK LINK AND WAKE UP ANY WAITERS.
531: 
532: RFNM:   LDB AC2,ELINKP          ; PICK UP HOST-LINK NUMBER
533:         TRNN AC2,177400         ; HOST ZERO?
534:         JRST HOST0              ; YES, NO SUCH HOST
535:         TRNN AC2,377            ; LINK 0?
536:         JRST L0RFNM             ; YES, UNBLOCK IT SEPARATELY
537:         PUSHJ P,FNDLNK          ; NO, SEARCH LINK TABLE FOR IT
538:         JRST UNL                ; NOT THERE, SEND BACK UNKNOWN LINK ERROR
539:         SKIPE DDB,IMPDDB-1(AC3) ; LINK THERE, DOES IT HAVE A DDB?
540:         PUSHJ P,UNBLOK          ; YES, UNBLOK IT AND RESUME ANY RELEVANT PROCESS
541:         JRST PSCAN              ; IF NO DDB, PROCESS MIGHT HAVE BEEN RESET, SO DON'T WORRY ABOUT IT
542: 
543: L0RFNM: PUSHJ P,UNBL0           ; UNBLOCK LINK 0 AND SEND ANY WAITING CONTROL MESSAGES
544:         JRST PSCAN
545: 
546: HOST0:  AOS NHOST0
547:         JRST PSCAN
548: 
549: ; NO-OPERATION. LOG AND LEAVE.
550: 
551: NOPCN:  AOS FLNOPS              ; NUMBER OF FIRST-LEVEL NO-OPS
552:         JRST PSCAN
    IMPCLK page# 0017 next  prev
554: ; HOST OR DESTINATION IMP DEAD. MARK HOST DEAD AND GIVE EVERYBODY ERRORS.
555: ; WAKE ANYBODY UP WAITING FOR US. FLUSH WAITING CLOCK LEVEL CONTROL MESSAGES.
556: 
557: DDEAD:  PUSHJ P,FLCWL0          ; FLUSH WAITING CONTROL MESSAGES
558:         LDB AC2,ELINKP          ; PICK UP HOST-LINK NUMBER
559:         ANDCMI AC2,377          ; CLEAR LINK NUMBER
560:         SKIPN AC3,FFLNK         ; PICK UP NUMBER OF FIRST FREE ENTRY IN LINK TABLE
561:         JRST MRKD               ; NONE THERE, MARK HOST DEAD AND LEAVE
562: DDL:    MOVEI TAC,(AC2)         ; SAVE COPY OF HOST NUMBER
563:         XOR TAC,LNKTAB-1(AC3)   ; COMPARE IT WITH HOST NUMBER IN LINK TABLE
564:         TRNN TAC,177400         ; DO HOST NUMBERS MATCH?
565:         JRST DDGOT              ; YES, WAKE HIM UP IF NECESSARY
566: DDLINC: SOJG AC3,DDL            ; LOOP AROUND FOR NEXT LINK TABLE ENTRY
567: MRKD:   LDB TEM,LINKP           ; PICK UP LINK NUMBER
568:         JUMPN TEM,PSCAN
569:         PUSHJ P,L0PTR           ; PICK UP POINTER INTO HOST TABLES
570:         ANDCAM AC3,L0BLOK(AC2)  ; CLEAR LINK
571:         JRST PSCAN
572: 
573: ; COME HERE WITH DDB OF AN ACTIVE CONNECTION TO SEE IF IT SHOULD
574: ; BE AWAKENED.
575: 
576: DDGOT:  MOVE TEM,IMPSTB-1(AC3)  ; PICK UP THIS HOLE'S STATUS BITS
577:         TLNE TEM,RFCR!RFCS      ; ANY CONNECTION HERE?
578:         SKIPN DDB,IMPDDB-1(AC3) ; IS THERE A DDB?
579:         JRST DDLINC             ; NO, LOOP AROUND
580:         MOVE IOS,DEVIOS(DDB)    ; YES, PICK UP STATUS WORD
581:         TLNE IOS,LNK0W          ; WAITING FOR LINK 0?
582:         SOS L0WAIT              ; YES, DECREMENT COUNT OF PEOPLE WAITING FOR LINK 0
583:         ORI IOS,HDEAD!IODTER
584:         ANDCMI IOS,BLOK         ; UNBLOCK LINK
585:         TLZE IOS,ANYW           ; ANY WAIT STATE?
586:         PUSHJ P,QRUN            ; YES, REQUE TO RUN STATE.
587:         MOVEM IOS,DEVIOS(DDB)   ; RESTORE STATUS WORD
588:         JRST DDLINC             ; GO LOOK AT NEXT ONE
    IMPCLK page# 0018 next  prev
590: ; INCOMPLETE TRANSMISSION, ERROR WITH MESSAGE IDENTIFICATION
591: 
592: INCT:   AOSA INCMTR
593: EWMI:   AOS ERWMI
594: STERB:  LDB AC2,ELINKP          ; PICK UP HOST-LINK NUMBER
595:         TRNN AC2,177400
596:         JRST HOST0              ; NO HOST ZERO
597:         TRNN AC2,377            ; LINK 0?
598:         JRST L0EWMI             ; YES, CLEAR IT SEPARATELY
599:         PUSHJ P,FNDLNK          ; NO, LOCATE POSITION IN LINK TABLE
600:         JRST PSCAN              ; UNKNOWN LINK. DO NOT SEND ERROR MESSAGE!
601:         SKIPN DDB,IMPDDB-1(AC3) ; IS THERE A DDB THERE?
602:         JRST NODDB              ; NO
603:         PUSHJ P,UNBLOK          ; YES, PICK UP IOS AND UNBLOCK LINK
604:         ORI IOS,IODERR
605:         MOVEM IOS,DEVIOS(DDB)   ; NOTE THAT AN ERROR HAS HAPPENED AND THAT WE MIGHT RECEIVE A RFNM LATER
606:         JRST PSCAN
607: 
608: L0EWMI: PUSHJ P,CLRBL0          ; UNBLOCK LINK
609:         PUSHJ P,CWL0            ; WAKE UP ANYBODY WAITING FOR LINK 0
610:         JFCL
611:         SKIPE L0WAIT            ; IS THERE ANYBODY AT USER-LEVEL WAITING?
612:         SKIPN AC3,FFLNK         ; YES, IS THERE A LINK TABLE TO SEARCH
613:         JRST PSCAN              ; NO, FLUSH TRANSFER AND LEAVE
614:         LDB AC2,ELINKP          ; PICK UP HOST-LINK NUMBER
615: L0EWL:  MOVEI TAC,(AC2)         ; SAVE HOST-LINK NUMBER
616:         XOR TAC,LNKTAB-1(AC3)   ; COMPARE IT WITH TABLE
617:         TRNN TAC,177400         ; DO HOST NUMBERS MATCH?
618:         JRST L0MRKE             ; YES
619: L0EWIN: SOJG AC3,L0EWL          ; NO, LOOP AROUND
620:         JRST PSCAN
621: 
622: L0MRKE: MOVE TEM,IMPSTB-1(AC3)
623:         TLNE TEM,RFCR!RFCS
624:         SKIPN DDB,IMPDDB-1(AC3) ; PICK UP DEVICE DATA BLOCK ADDRESS
625:         JRST L0EWIN             ; NONE THERE, LOOP AROUND
626:         MOVE IOS,DEVIOS(DDB)
627:         TLZN IOS,LNK0W          ; WAITING FOR LINK 0?
628:         JRST L0EWIN             ; NO, FORGET IT
629:         PUSHJ P,QRUN            ; YES, PUT HIM IN RUN QUEUE
630:         ORI IOS,IODERR          ; AND GIVE HIM ERROR MESSAGE
631:         MOVEM IOS,DEVIOS(DDB)
632:         SKIPE L0WAIT            ; ARE THERE ANY MORE WAITERS?
633:         JRST L0EWIN             ; YES, GO LOOK FOR THEM
634:         JRST PSCAN
    IMPCLK page# 0019 next  prev
636: ; UNKNOWN LINK AND NO DDB ERROR TYPEOUTS
637: 
638: UNL:    TELCTR(UNKLNK,<UNKNOWN LINK>)
639:         PUSHJ P,UNLMER
640:         JRST PSCAN
641: 
642: UNLMER: PUSH P,AC1              ; SAVE INPUT MESSAGE ADDRESS
643:         PUSHJ P,MAKERB          ; MAKE UP AN ERROR BLOCK
644:         PUSHJ P,CLKWAIT         ; IF NONE, WAIT FOR IT (SIGH)
645:         PUSHJ P,EFILL           ; SEND HIM BACK HIS COMMAND
646:         MOVEI AC3,LNC           ; GIVE HIM LINK-NOT-CONNECTED ERROR
647:         DPB AC3,BYTE2P
648:         PUSHJ P,CLKOUT          ; SEND IT OUT
649:         POP P,AC1               ; GET BACK HIS MESSAGE
650:         POPJ P,
651: 
652: NODDB:  TELCTR(NODDBS,<NO DDB>)
653:         JRST PSCAN
    IMPCLK page# 0020 next  prev
655: ; ROUTINE TO MAKE UP A POINTER INTO THE HOST TABLES
656: ; CALL WITH POINTER TO INCOMMING MESSAGE IN AC1
657: ; RETURNS INDEX IN AC2 AND SINGLE BIT IN AC3
658: 
659: L0PTR:  LDB AC2,[POINT 5,TDATA(AC1),15]
660:         MOVEI AC3,1
661:         LSH AC3,(AC2)
662:         LDB AC2,[POINT 3,TDATA(AC1),10]
663:         POPJ P,
664: 
665: ; ROUTINE TO UNBLOCK LINK ZERO
666: ; CALL WITH POINTER TO INCOMMING MESSAGE IN AC1
667: 
668: CLRBL0: PUSHJ P,L0PTR
669:         TDNN AC3,L0BLOK(AC2)    ; FIRST, IS IT BLOCKED?
670:         JRST ILLUNB
671:         ANDCAM AC3,L0BLOK(AC2)  ; YES, CLEAR IT
672:         POPJ P,
    IMPCLK page# 0021 next  prev
674: ; ROUTINE TO UNBLOCK LINK ZERO AND WAKE UP ANYBODY WAITING FOR IT
675: 
676: UNBL0:  PUSHJ P,CLRBL0          ; CLEAR BLOCK ON LINK ZERO
677:         PUSHJ P,CWL0            ; WAKE UP ANY CLOCK LEVEL WAITERS
678:         SKIPN L0WAIT            ; ANY UUO LEVEL WAITERS?
679:         POPJ P,                 ; LEAVE IF A CLOCK LEVEL WAITER WAS AWOKEN OR IF NO UUO WAITERS
680:         SKIPN AC3,FFLNK         ; SCAN LINK TABLE
681:         JRST NOLNKS             ; NONE THERE, ERROR
682:         LDB AC2,ELINKP          ; PICK UP HOST-LINK NUMBER
683: L0FL:   MOVE TAC,AC2
684:         XOR TAC,LNKTAB-1(AC3)
685:         TRNN TAC,177400         ; HOST NUMBERS MATCH?
686:         JRST L0TRY              ; YES, SEE IF HE IS WAITING FOR LINK 0
687: L0INCR: SOJG AC3,L0FL
688:         POPJ P,
689: 
690: L0TRY:  SKIPN DDB,IMPDDB-1(AC3)
691:         JRST L0INCR
692:         MOVE IOS,DEVIOS(DDB)
693:         TLZN IOS,LNK0W
694:         JRST L0INCR
695:         SOS L0WAIT              ; NOTE ONE LESS UUO-LEVEL WAITER
696:         PUSHJ P,QRUN
697:         MOVEM IOS,DEVIOS(DDB)
698:         SKIPE L0WAIT
699:         JRST L0INCR
700:         POPJ P,
701: 
702: NOLNKS: TELCTR(NRFNL,<RFNM WITH NO LINK>)
703:         POPJ P,
    IMPCLK page# 0022 next  prev
705: ; ROUTINE TO TRANSMIT ANY MESSAGES IN CLOCK WAIT ON LINK 0
706: ; CALL WITH INCOMMING MESSAGE CAUSING UNBLOCKING IN AC1
707: ; SKIPS IF ANY WAITING MESSAGES WERE FOUND
708: 
709: CWL0:   SETZ TAC1,              ; NOTE NO PREVIOUS WAITER
710:         LDB AC3,SRCP            ; PICK UP HOST NUMBER
711:         SKIPN AC2,L0CWTL        ; PICK UP WAIT LIST
712:         POPJ P,                 ; NONE THERE
713: CWL0A:  LDB TAC,[POINT 8,TDATA(AC2),15]
714:         CAMN TAC,AC3            ; SAME HOST?
715:         JRST CWL0G              ; YES, SERVE HIM
716:         MOVE TAC1,AC2           ; PUT THIS BLOCK IN LAST BLOCK POSITION
717:         HLRZ AC2,TLINK(AC2)     ; PICK UP NEXT BLOCK ADDRESS
718:         JUMPN AC2,CWL0A         ; IF THERE IS ONE, LOOP AROUND AND SERVE IT
719:         POPJ P,
720: 
721: CWL0G:  PUSHJ P,UNLCW           ; UNLINK IT
722:         PUSH P,AC1
723:         MOVE AC1,AC2
724:         PUSHJ P,QOUT            ; SEND IT OUT
725:         POP P,AC1
726:         PUSHJ P,L0PTR
727:         ORM AC3,L0BLOK(AC2)     ; NOTE LINK 0 BLOCKED
728:         JRST CPOPJ1             ; GIVE SKIP RETURN
729: 
730: ; ROUTINE TO UNLINK A BLOCK FROM THE CLOCK WAIT LIST
731: ; CALL WITH BLOCK ADDRESS IN AC2 AND ACCRESS OF PREVIOUS BLOCK IN TAC1
732: 
733: UNLCW:  JUMPN TAC1,CWL0NN
734:         HLRZ AC3,TLINK(AC2)     ; PICK UP ADDRESS OF NEXT BLOCK
735:         HRRM AC3,L0CWTL
736:         SKIPN AC3
737:         SETZM L0CWTL
738:         POPJ P,
739: 
740: CWL0NN: HLRZ AC3,TLINK(AC2)
741:         HRLM AC3,TLINK(TAC1)
742:         SKIPN AC3
743:         HRLM TAC1,L0CWTL
744:         POPJ P,
    IMPCLK page# 0023 next  prev
746: ; ROUTINE TO FLUSH ALL CLOCK-LEVEL OUTPUTS TO A PARTICULAR HOST
747: ; CALL WITH INCOMMING MESSAGE IN AC1
748: 
749: FLCWL0: SETZ TAC1,
750:         LDB AC3,SRCP
751:         SKIPN AC2,L0CWTL
752:         POPJ P,
753: FLCWA:  LDB TAC,[POINT 8,TDATA(AC2),15]
754:         CAMN TAC,AC3
755:         JRST FLCG
756:         MOVE TAC1,AC2
757:         HLRZ AC2,TLINK(AC2)
758:         JUMPN AC2,FLCWA
759:         POPJ P,
760: 
761: FLCG:   HLRZ DAT,TLINK(AC2)
762:         PUSH P,AC3              ; SAVE STATE OF SCAN
763:         PUSH P,DAT
764:         PUSH P,AC1
765:         PUSH P,TAC1
766:         PUSHJ P,UNLCW           ; UNLINK LIST FROM WAIT LIST
767:         MOVE AC1,AC2
768:         PUSHJ P,RELLST          ; RELEASE STORAGE IN LIST
769:         POP P,TAC1
770:         POP P,AC1
771:         POP P,AC2
772:         POP P,AC3
773:         JUMPN AC2,FLCWA
774:         POPJ P,
    IMPCLK page# 0024 next  prev
776: ; UNBLOCKING ROUTINE FOR NON-ZERO LINK
777: ; DDB MUST BE SET UP
778: 
779: UNBLOK: MOVE IOS,DEVIOS(DDB)
780:         TRZN IOS,BLOK           ; IS IT BLOCKED?
781:         JRST ILLUNB
782:         TLZE IOS,BLOKW          ; IS HE WAITING FOR IT TO BECOME UNBLOCKED?
783:         PUSHJ P,QRUN            ; YES, WAKE HIM UP
784: UNBLK1: MOVEM IOS,DEVIOS(DDB)
785:         POPJ P,
786: 
787: ILLUNB: PUSH P,DDB
788:         SKIPN RECOVER
789:         SETOM RECOVER
790:         TELCTR(BDRFNM,<UNBLOCKING AN ALREADY UNBLOCKED LINE>)
791:         POP P,DDB
792:         POPJ P,
793: 
794: ; ROUTINE TO FIND THE INDEX OF A GIVEN HOST-LINK NUMBER
795: ; FINDS SEND-SIDE INDEX ONLY
796: ; ENTER WITH HOST-LINK NUMBER IN AC2
797: ; RETURNS INDEX INTO LNKTAB AND IMPDDB IN AC3
798: ; SKIPS ON SUCCESS
799: 
800: FNDLNK: SKIPN AC3,FFLNK         ; PICK UP NUMBER OF FIRST FREE LINK
801:         POPJ P,
802: FNDL1:  CAMN AC2,LNKTAB-1(AC3)  ; IS THIS IT?
803:         JRST FNDL2              ; YES, CHECK FOR SEND-SIDE
804: FNDL3:  SOJG AC3,FNDL1
805:         POPJ P,
806: 
807: FNDL2:  MOVE TEM,IMPLS-1(AC3)
808:         TRNN TEM,1
809:         JRST FNDL3
810:         JRST CPOPJ1
 EOF: IMPCLK end-of-file. cnt=